home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 17 / CU Amiga Magazine's Super CD-ROM 17 (1997)(EMAP Images)(GB)[!][issue 1997-12].iso / CUCD / Programming / DiceSource / src / dcpp / main.c < prev    next >
C/C++ Source or Header  |  1997-09-09  |  7KB  |  347 lines

  1. /*
  2.  *    (c)Copyright 1992-1997 Obvious Implementations Corp.  Redistribution and
  3.  *    use is allowed under the terms of the DICE-LICENSE FILE,
  4.  *    DICE-LICENSE.TXT.
  5.  */
  6.  
  7. /*
  8.  *  MAIN.C
  9.  *
  10.  *  CPP inputfile <options>
  11.  *
  12.  */
  13.  
  14. #include "defs.h"
  15. #include "DCPP_rev.h"
  16.  
  17. static char *DCopyright =
  18. "Copyright (c) 1992,1993,1994 Obvious Implementations Corp., Redistribution & Use under DICE-LICENSE.TXT." VERSTAG;
  19.  
  20.  
  21. Prototype FILE *Fo;
  22. Prototype char *OutName;
  23. Prototype char *DefAmigaDir;
  24. Prototype short DDebug;
  25. Prototype short ExitCode;
  26. Prototype short NoDefaultIncs;
  27. Prototype short UndefSyms;
  28. Prototype short TriGraph;
  29. Prototype short GlobalStringize;
  30. Prototype short SlashSlashOpt;
  31. Prototype short UnixOpt;
  32. Prototype short FFPDef;
  33. Prototype short ForceLineSpec;
  34. Prototype short ErrorOpt;
  35. Prototype FILE    *ErrorFi;
  36. Prototype short StripOpt;
  37. Prototype PreCompNode *PreCompBase;
  38. Prototype char VersionId[];
  39. Prototype short AnyPrecomps;
  40.  
  41. Prototype int main(int, char **);
  42. Prototype void ParseOpts(short, char **, short);
  43. Prototype void help(int);
  44. Prototype char *mergestr(char *s1, char *s2);
  45.  
  46. #ifdef _DCC
  47. char VersionId[] = { VERSION, REVISION, 0 };
  48. #else
  49. char VersionId[] = { "" };
  50. #endif
  51.  
  52. FILE *Fo;
  53. char *InFile;
  54. char *OutFile;
  55. char *OutName;
  56. char *DefIncludePath;
  57. char *DefAmigaDir;
  58. char Prefix[64];
  59. short DDebug;
  60. short ExitCode;
  61. short NoDefaultIncs;
  62. short UndefSyms;
  63. short TriGraph = 1;
  64. short GlobalStringize;
  65. short SlashSlashOpt;
  66. short UnixOpt;
  67. short FFPDef;
  68. short ForceLineSpec;
  69. short AnyPrecomps;
  70. short IncPri = 8;        /*    command line -I options go before defaults */
  71. short ErrorOpt;
  72. FILE  *ErrorFi;
  73. short StripOpt;
  74. PreCompNode *PreCompBase;
  75.  
  76.  
  77. int _DiceCacheEnable = 1;
  78.  
  79. int _bufsiz = 8192;
  80.  
  81. int
  82. main(ac, av)
  83. int ac;
  84. char *av[];
  85. {
  86.     FILE *fi;
  87.  
  88.     if (ac == 1)
  89.     help(1);
  90.  
  91.     {
  92.     char *ptr;
  93.     char *p2;
  94.  
  95.     if ((ptr = strrchr(av[0], '/')) || (ptr = strrchr(av[0], ':')))
  96.         ++ptr;
  97.     else
  98.         ptr = av[0];
  99.     if ((p2 = strchr(ptr, '_')) == NULL)
  100.         p2 = ptr;
  101.     else
  102.         ++p2;
  103.     sprintf(Prefix, "%.*s", p2 - ptr, ptr);
  104.     }
  105.  
  106. #ifdef AMIGA
  107.     DefIncludePath = mergestr(Prefix, "dinclude:");
  108. #else
  109.     if (getenv("DINCLUDE")) {
  110.     DefIncludePath = getenv("DINCLUDE");
  111.     } else {
  112.     DefIncludePath = mergestr("/home/dice/", Prefix);
  113.     DefIncludePath = mergestr(DefIncludePath, "include/");
  114.     }
  115. #endif
  116.     DefAmigaDir = mergestr(DefIncludePath, "amiga");
  117.     dbprintf(("DefAmigaDir: %s\n", DefAmigaDir));
  118.     dbprintf(("DefIncludePath: %s\n", DefIncludePath));
  119.  
  120.     InitPrecomp();
  121.     InitCpp();
  122.  
  123.     AddInclude(DefIncludePath, 5);
  124.     AddInclude(mergestr(DefIncludePath, "pd"), 5);
  125.     AddInclude(DefAmigaDir, 5);
  126.  
  127.     ParseOpts(ac, av, 1);
  128.  
  129.     IncPri = 10;     /*  any #pragma -I options go before everything */
  130.  
  131.     if (InFile == NULL)
  132.     cerror(EFATAL_INPUT_FILE_REQUIRED);
  133.  
  134.     fi = fopen(InFile, "r");
  135.     if (fi == NULL) {
  136.     ErrorOpenFailed(InFile, 0);
  137.     exit(20);
  138.     }
  139.  
  140.     if (OutFile) {
  141.     Fo = fopen(OutFile, "w+");
  142.     if (Fo == NULL)
  143.         cerror(EFATAL_CANT_CREATE_FILE, OutFile);
  144.     OutName = OutFile;
  145.     } else {
  146.     Fo = stdout;
  147.     }
  148.  
  149.     InitDefines(InFile);
  150.     InitDirective();
  151.  
  152.     cpp(0, 0, InFile, fi, NULL, 0);
  153.  
  154.     fclose(Fo);
  155.     if (ExitCode > 5) {
  156.     if (OutName)
  157.         remove(OutName);
  158.     }
  159.     return(ExitCode);
  160. }
  161.  
  162. void
  163. help(int code)
  164. {
  165.     printf("%s\n%s\n", VSTRING, DCopyright);
  166.     puts("DCPP infile [-o outfile] <other-options>");
  167.     exit(code);
  168. }
  169.  
  170. #ifdef NOTDEF
  171.  
  172. extern long *__MemList;
  173.  
  174. void
  175. du(ptr)
  176. long *ptr;
  177. {
  178.     char buf[64];
  179.  
  180.     sprintf(buf, "%08lx %08lx %d\n", ptr, ptr[0], ptr[1]);
  181.     Write(Output(), buf, strlen(buf));
  182. }
  183.  
  184. #endif
  185.  
  186. void
  187. ParseOpts(short ac, char **av, short cppOnly)
  188. {
  189.     short i;
  190.  
  191.     for (i = 1; i < ac; ++i) {
  192.     char *ptr = av[i];
  193.  
  194.     if (*ptr != '-') {
  195.         /*
  196.          *    If from a #pragma (cppOnly == 0) then do not parse any
  197.          *    new file names, they could be part of previous options
  198.          *    that were not meant for us.
  199.          */
  200.  
  201.         if (cppOnly) {
  202.         InFile = ptr;
  203.         AddSourceDirInclude(InFile);
  204.         }
  205.         continue;
  206.     }
  207.     ptr += 2;
  208.     switch(ptr[-1]) {
  209.     case '1':       /*  -1.x    */
  210.     case '2':       /*  -2.x    */
  211.     case '3':       /*  -3.x    */
  212.     case '4':       /*  -4.x    */
  213.     case '5':       /*  -5.x    */
  214.         if (ptr[0] != '.')
  215.         help(1);
  216.         {
  217.         static char ABuf[32];
  218.  
  219. #ifdef AMIGA
  220.         sprintf(ABuf, "%sdinclude:amiga%c%c",
  221.             Prefix,
  222.             ptr[-1],
  223.             ptr[1]
  224.         );
  225. #else
  226.         sprintf(ABuf, "/home/dice/%sinclude/amiga%c%c",
  227.             Prefix,
  228.             ptr[-1],
  229.             ptr[1]
  230.         );
  231. #endif
  232.         if (DefAmigaDir)
  233.             RemInclude(DefAmigaDir);
  234.         DefAmigaDir = ABuf;
  235.         AddInclude(DefAmigaDir, 5);
  236.         dbprintf(("change DefAmigaDir: %s\n", DefAmigaDir));
  237.         }
  238.         break;
  239.     case 'n':
  240.         if (strcmp(ptr, "otri") == 0) {
  241.         TriGraph = 0;
  242.         break;
  243.         } else if (strcmp(ptr, "opragma") == 0) {
  244.         /*PragmaWarn = 0;*/
  245.         break;
  246.         }
  247.         if (cppOnly)
  248.         cppOnly = -1;
  249.         break;
  250.     case 'd':
  251.         if (*ptr)
  252.         DDebug = atoi(ptr);
  253.         else
  254.         DDebug = 1;
  255.         break;
  256.     case 'f':
  257.         if (strcmp(ptr, "fp") == 0)
  258.         FFPDef = 1;
  259.         break;
  260.     case 'o':
  261.         if (*ptr)
  262.         OutFile = ptr;
  263.         else
  264.         OutFile = av[++i];
  265.         break;
  266.     case 'D':
  267.         if (*ptr == 0)
  268.         ptr = av[++i];
  269.         DefineOptSymbol(ptr);
  270.         break;
  271.     case 'H':   /*  -H<path>=<header> - precompiled header spec */
  272.         AnyPrecomps = 1;
  273.         if (*ptr == 0)
  274.         ptr = av[++i];
  275.         {
  276.         PreCompNode *pcn = malloc(sizeof(PreCompNode));
  277.         pcn->pn_Next = PreCompBase;
  278.         pcn->pn_OutName = ptr;
  279.         if ((pcn->pn_HeadName = strchr(ptr, '=')) != NULL)
  280.             *pcn->pn_HeadName++ = 0;
  281.         else
  282.             help(1);
  283.         PreCompBase = pcn;
  284.         }
  285.         break;
  286.     case 'I':
  287.         if (ptr[0] == '0' && ptr[1] == 0) {
  288.         NoDefaultIncs = 1;
  289.         RemAllIncludes();
  290.         AddSourceDirInclude(InFile);
  291.         DefAmigaDir = NULL;
  292.         break;
  293.         }
  294.         if (*ptr)
  295.         AddInclude(ptr, IncPri);
  296.         else
  297.         AddInclude(av[++i], IncPri);
  298.         break;
  299.     case 'u':
  300.         if (strcmp(ptr, "nix") == 0) {
  301.         UnixOpt = 1;
  302.         }
  303.         break;
  304.     case 'U':
  305.         UndefSyms = 1;
  306.         break;
  307.     case 'E':
  308.         ErrorOpt = 1;
  309.         if (*ptr == 'E')
  310.         ErrorOpt = 2;
  311.         ptr = av[++i];
  312.         ErrorFi = fopen(ptr, "a");
  313.         break;
  314.     case '/':
  315.         if (strcmp(ptr-1, "//") == 0) {
  316.         SlashSlashOpt = 1;
  317.         } else {
  318.         if (cppOnly)
  319.             cppOnly = -1;
  320.         }
  321.         break;
  322.     case 's':
  323.         if (strcmp(ptr, "trip") == 0) {
  324.         StripOpt = 1;
  325.         }
  326.         break;
  327.     default:
  328.         if (cppOnly)
  329.         cppOnly = -1;
  330.         break;
  331.     }
  332.     if (cppOnly < 0)
  333.         break;
  334.     }
  335.     if (cppOnly < 0)
  336.     help(1);
  337. }
  338.  
  339. char *
  340. mergestr(char *s1, char *s2)
  341. {
  342.     char *ptr = malloc(strlen(s1) + strlen(s2) + 1);
  343.     sprintf(ptr, "%s%s", s1, s2);
  344.     return(ptr);
  345. }
  346.  
  347.